/*
 * colasPeticion.c
 *
 *  Created on: 04/11/2011
 *      Author: utn_so
 */

/*
 * colas.c
 *
 *  Created on: 15/09/2011
 *      Author: utn_so
 */
#include<stdio.h>
#include<stdlib.h>
#include"./includes/colasPeticion.h"
#include "./includes/funcionesAlgoritmo.h"
#include "./includes/variablesGlobales.h"

//int main()
//{
//   ptrNodo colafte,colafin;
//   colafte=NULL;
//   colafin=NULL;
//   int eleccion;
//   nodo_t elemento;
//   strcpy(elemento.mensaje,"Hola");
//
//   titulo();
//   printf( "? " );
//   scanf( "%d", &eleccion );
//
//
//   while ( eleccion != 3 ) {
//
//      switch ( eleccion ) {
//
//         case 1:
//            printf( "Introduzca peticion: " );
//            scanf( "\n%d", &elemento.peticion );
//            printf( "Introduzca flagRW: " );
//            scanf( "\n%d", &elemento.flagRW );
//            printf( "Introduzca lonMsj: " );
//            scanf( "\n%d", &elemento.lonMsj );
//            printf( "Introduzca Mensaje: " );
////            memcpy(&elemento.mensaje,"Hola",sizeof("Hola"));
//            agregar( &colafte,&colafin, elemento );
//            mostrarLista( colafte );
//            break;
//
//         case 2:
//        	if ( !estaVacia( colafte ) ) {
//        		   suprimir( &colafte, &colafin );
//        		   mostrarLista( colafte );
//               }
//        	else{
//                 printf( "la pila ya esta vacia\n");
//            }
//            break;
//
//         default:
//            printf( "Opcion invalida.\n\n" );
//            titulo();
//            break;
//
//      }
//
//      printf( "? " );
//      scanf( "%d", &eleccion );
//   }
//
//   printf( "Fin del programa.\n" );
//
//   return 0;
//
//}


void agregar (ptrNodo *ColaFte,ptrNodo *ColaFin,nodo_t valores){
	ptrNodo ptrNuevo;
	ptrNuevo=malloc(sizeof(nodo_t));

	ptrNuevo->peticion=valores.peticion;
	ptrNuevo->flagRW=valores.flagRW;
	ptrNuevo->lonMsj=valores.lonMsj;
	ptrNuevo->socket=valores.socket;
	memcpy(&ptrNuevo->mensaje,valores.mensaje,valores.lonMsj);
	ptrNuevo->ptrSgte=NULL;

	if(*ColaFte==NULL) {
		*ColaFte=ptrNuevo;
	}
	else{
		(*ColaFin)->ptrSgte=ptrNuevo;
	}
	*ColaFin=ptrNuevo;
}

uint32_t suprimir (ptrNodo *ColaFte, ptrNodo *ColaFin){
	ptrNodo ptr;

	uint32_t sector;
	ptr=*ColaFte;
	*ColaFte=(*ColaFte)->ptrSgte;
	if (*ColaFte==NULL){
		*ColaFin=NULL;
	}
	sector = ptr->peticion;
	free(ptr);
	return sector;
}

void titulo(void){
	printf("¿Que queres hacer?\n"
		"1 : Para insertar un nodo\n"
		"2 : Para eliminar  un nodo\n"
		"3 : Para salir del programa un nodo\n");
}


uint32_t estaVacia (ptrNodo ColaFte){
	if(ColaFte == NULL){ // si la lista esta vacia
		return 1;   //returna verdadero
	}
	else{
		return 0;   // returna falso
	}
}





void mostrarLista (ptrNodo ColaFte){
	ptrNodo ptr;
	ptr=ColaFte;
	if (ptr == NULL){
		printf("La cola esta vacia.\n\n");
	}
	else{
		printf("La cola es: \n");
		while(ptr !=NULL){
			printf("%d --> ", ptr->peticion);
			ptr=ptr->ptrSgte;
		}
		printf("NULL\n\n");
	}
}

void suprimirColaSincro (ptrNodo *ColaFte, ptrNodo *ColaFin){
	ptrNodo ptr;

	ptr=*ColaFte;
	*ColaFte=(*ColaFte)->ptrSgte;
	if (*ColaFte==NULL){
		*ColaFin=NULL;
	}

	free(ptr);
}

uint32_t suprimirNodoAux (ptrNodo Lista,nodo_t nodoAux){
	ptrNodo ptr;
	ptrNodo ptrAnt;

	if(Lista==NULL){
		puts("Está por romper");
		getchar();
	}

	if (Lista->peticion == nodoAux.peticion){
		ptr=Lista;
		Lista=Lista->ptrSgte;
		nodoAux.peticion=ptr->peticion;
		nodoAux.flagRW =ptr->flagRW;
		nodoAux.lonMsj = ptr->lonMsj;
		memcpy(nodoAux.mensaje,&ptr->mensaje,512);
		nodoAux.socket = ptr->socket;
		free(ptr);
		return 1;
	}
	else{
		ptrAnt=Lista;
		ptr=Lista->ptrSgte;
		while(ptr!=NULL && ptr->peticion != nodoAux.peticion){
			ptrAnt=ptr;
			ptr=ptr->ptrSgte;
		}
		if(ptr!=NULL){
			ptrAnt->ptrSgte=ptr->ptrSgte;
			nodoAux.peticion=ptr->peticion;
			nodoAux.flagRW =ptr->flagRW;
			nodoAux.lonMsj = ptr->lonMsj;
			memcpy(nodoAux.mensaje,&ptr->mensaje,512);
			nodoAux.socket = ptr->socket;
			free(ptr);
			return 1;
		}
	}
	nodoAux.peticion=-1;
	return nodoAux.peticion;
}

uint32_t reencolarNodoAux (ptrNodo Lista,uint32_t socket, uint32_t cant_PDD){
	ptrNodo ptr;
	ptrNodo ptrAnt;
	nodo_t nodoAux;

	if (Lista->socket == socket){
		ptr=Lista;

		otorgarPeticionDisco(ptr->peticion, cant_PDD, sectoresPorDisco, desc_PDD, ptr->socket);

		nodoAux.peticion = ptr->peticion; //NEW FRIENDS
		suprimirNodoAux(colaAuxFte,nodoAux);
		return 1;
	}
	else{
		ptrAnt=Lista;
		ptr=Lista->ptrSgte;
		while(ptr!=NULL && ptr->socket != socket){
			ptrAnt=ptr;
			ptr=ptr->ptrSgte;
		}
		if(ptr!=NULL){
			ptrAnt->ptrSgte=ptr->ptrSgte;
			otorgarPeticionDisco(ptr->peticion, cant_PDD, sectoresPorDisco, desc_PDD, ptr->socket);
			nodoAux.peticion = ptr->peticion; //NEW FRIENDS
			suprimirNodoAux(&colaAuxFte,nodoAux);
			return 1;
		}
		}
	return 0;
}
